require('dotenv').config();
//引入EXPRESS组件
const express = require('express');
const bodyParser = require('body-parser');

// 引入自定义中间件
const httpLogger = require('./middleware/httpLogger');
const errorHandler = require('./middleware/errorHandler');
// 引入轮播图初始化脚本
const { initBannersData } = require('./scripts/initBanners');

// 统一使用数据库配置
const { sequelize } = require('./config/database');

const healthRoutes = require('./routes/health');
const debugRoutes = require('./routes/debug');
//引入用户路由
const userRoutes = require('./routes/users.route');
//引入地址路由
const addressRoutes = require('./routes/userAddress.route');
//引入轮播图路由
const bannerRoutes = require('./routes/banner.route');
//引入分类路由
const categoryRoutes = require('./routes/category.route');
//引入商品路由
const goodsRoutes = require('./routes/goods.route');


// 创建 Express 应用
const app = express();

// 使用 HTTP 日志中间件
app.use(httpLogger);

// 使用 body-parser 中间件解析 JSON 请求体  
app.use(bodyParser.json());

//注册健康检查路由
app.use('/health', healthRoutes);
//注册 Debug 路由
app.use('/api/test', debugRoutes);
//注册用户路由
app.use('/api/users', userRoutes);
//注册地址路由
app.use('/api/user-address', addressRoutes);
//注册轮播图路由
app.use('/api/banners', bannerRoutes);
//注册分类路由
app.use('/api/categories', categoryRoutes);
//注册商品路由
app.use('/api/goods', goodsRoutes);

// 使用统一错误处理中间件
app.use(errorHandler);

const PORT = process.env.PORT || 3001;

async function startServer() {
  try {
    await sequelize.authenticate();
    console.log('数据库连接成功');

    // 开发环境下初始化轮播图数据
    if (process.env.NODE_ENV === 'development') {
      await initBannersData(sequelize);
    }

    // 在测试环境中不启动服务器，只导出app
    if (process.env.NODE_ENV !== 'test') {
      app.listen(PORT, () => {
        console.log(`服务器运行在端口 ${PORT}`);
      });
    }
  } catch (err) {
    console.error('启动失败：', err);
    // 在测试环境中不退出进程
    if (process.env.NODE_ENV !== 'test') {
      process.exit(1);
    }
  }
}
// 启动服务器
startServer();

// 导出app实例供测试使用
module.exports = app;